package cn.usian.controller;

import cn.usian.common.R;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

@RestController
@RequestMapping("/common")
public class CommonController {
    //获取配置文件中的图片存储在本地的位置
    @Value("${reggie.path}")
    private String path;

    @PostMapping("/upload")
    public R upload(MultipartFile file) throws IOException {
        //1.获取文件名
        String filename = file.getOriginalFilename();//3.jpg

        //2.获取数据库
        String extName = filename.substring(filename.lastIndexOf("."));
        //3.使用UUID重新构建一个新的名字  UUID是由当前毫秒前+cpu序列号算出的全球唯一的值
       String uuidFileName =  UUID.randomUUID().toString()+ extName;


       //2.构建文件存储的目录
        File dir = new File(path);
        //判定file对象是否存在
        if (!dir.exists()){
            //如果不存在创建对应场景
            dir.mkdirs();
        }
        //目标文件  目录+文件名
        File targetFile = new File(dir, uuidFileName);
        //把上传前的文件拷贝到目标文件上（本质上其实就是以前学习的io流拷贝文件）
        file.transferTo(targetFile);
        return R.success(uuidFileName);
    }

    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException{
        //1.  找到目标文件
        File targetFile = new File(path, name);
        //2.建立文件输入流，读取文件内容
        FileInputStream fileInputStream = new FileInputStream(targetFile);
        //得到响应的输出流  将读取到的数据响应到服务器中
        ServletOutputStream outputStream = response.getOutputStream();

        byte[] buf = new byte[1024];
        int length = 0;
        //边读边写
        //读取到的结果为-1说明读取完成
        while ((length=fileInputStream.read(buf))!=-1){
            outputStream.write(buf,0,length);
        }
        //关流
        fileInputStream.close();
    }

}
